前一天我們已經完成了靜態的畫面框架,現在要加入互動功能,讓使用者可以輸入訊息,並立即在訊息區看到自己發送的內容。
1. 使用 useState 儲存訊息
React 提供 Hook useState 讓我們可以保存「聊天訊息」的狀態。
在這裡我們會建立一個 messages 陣列,存放所有訊息。
"use client";
import React, { useState } from "react";
2. 修改 MessageArea 顯示訊息
我們把 Day 1 的 MessageArea 改寫,讓它能顯示所有訊息。
(如果訊息是空的,就顯示「這裡會顯示聊天內容」)
const MessageArea = ({ messages }) =>
  React.createElement("div", {
    style: {
      flex: 1,
      border: "1px solid #ccc",
      borderRadius: "8px",
      padding: "12px",
      backgroundColor: "#f9f9f9",
      overflowY: "auto"
    }
  },
    messages.length === 0
      ? "這裡會顯示聊天內容"
      : messages.map((msg, i) =>
          React.createElement("div", { key: i, style: { marginBottom: "8px" } }, msg)
        )
  );
3. 修改 InputArea,加入輸入框狀態 + 發送功能
我們要用 useState 來記錄目前輸入框的內容,然後在按下按鈕時,把文字加到 messages。
const InputArea = ({ onSend }) => {
  const [input, setInput] = useState("");
  return React.createElement("div", { style: { display: "flex", marginTop: "12px" } },
    React.createElement("input", {
      type: "text",
      placeholder: "輸入訊息...",
      value: input,
      onChange: (e) => setInput(e.target.value),
      style: {
        flex: 1,
        padding: "8px",
        border: "1px solid #ccc",
        borderRadius: "4px"
      }
    }),
    React.createElement("button", {
      style: { marginLeft: "8px", padding: "8px 16px" },
      onClick: () => {
        if (input.trim() !== "") {
          onSend(input);   // 把訊息傳回父層
          setInput("");    // 清空輸入框
        }
      }
    }, "發送")
  );
};
4. 組合 ChatPage(主頁面)
我們把 messages 狀態放在最上層的 ChatPage,
然後把它傳給 MessageArea,再把 onSend 傳給 InputArea。
export default function ChatPage() {
  const [messages, setMessages] = useState([]);
  const handleSend = (msg) => {
    setMessages([...messages, msg]);
  };
  return React.createElement("div", {
    style: {
      display: "flex",
      flexDirection: "column",
      height: "100vh",
      maxWidth: "600px",
      margin: "0 auto",
      padding: "16px"
    }
  },
    React.createElement("h1", {
      style: { fontSize: "24px", textAlign: "center", marginBottom: "16px" }
    }, "🤖 智慧聊天機器人"),
    React.createElement(MessageArea, { messages }),
    React.createElement(InputArea, { onSend: handleSend })
  );
}
🎉 今天我們完成了聊天介面的互動功能!
使用者可以在輸入框輸入訊息
點擊「發送」或按下 Enter 鍵即可傳送訊息
訊息會即時顯示在聊天區,介面仍然保持整齊排版
到目前為止,我們已經完成了 前端的完整互動基礎。